package ar.com.uade.administradorsiembra.controladores;

import java.util.Date;
import java.util.List;
import ar.com.uade.administradorsiembra.modelo.Cereal;
import ar.com.uade.administradorsiembra.modelo.Lote;
import ar.com.uade.administradorsiembra.modelo.Sembradora;
import ar.com.uade.administradorsiembra.modelo.Siembra;
import ar.com.uade.administradorsiembra.modelo.exceptions.NoHayLotesParaSembrarException;
import ar.com.uade.administradorsiembra.modelo.reglas.MotorValidaciones;
import ar.com.uade.administradorsiembra.modelo.reglas.RNCerealMayorRendimiento;
import ar.com.uade.administradorsiembra.modelo.reglas.RNMineralPrincipal;
import ar.com.uade.administradorsiembra.modelo.reglas.RNPosiblesCereales;
import ar.com.uade.administradorsiembra.modelo.reglas.RNSeleccionTipoCereal;
import ar.com.uade.administradorsiembra.persistencia.LoteMapper;
import ar.com.uade.administradorsiembra.persistencia.SiembraMapper;

public class PlanificarSiembraController {
	private static PlanificarSiembraController controller;
	private SiembraMapper siembraMapper;
	private LoteMapper loteMapper;
	
	private PlanificarSiembraController(){	
	}
	
	private SiembraMapper getSiembraMapper(){
		if(siembraMapper == null){
			siembraMapper = new SiembraMapper();
		}
		
		return siembraMapper;
	}
	
	private LoteMapper getLoteMapper(){
		if(loteMapper == null){
			loteMapper = new LoteMapper();
		}
		
		return loteMapper;
	}
	
	public static PlanificarSiembraController getInstancia(){
		if(controller == null) {
			controller = new PlanificarSiembraController();
		}
		
		return controller;
	}
	
	public Sembradora planificarSiembra(Date fechaDesde, Date fechaHasta) throws NoHayLotesParaSembrarException {		
		MotorValidaciones motorValidaciones = new MotorValidaciones();
		
		motorValidaciones.addRegla(new RNMineralPrincipal(1));
		motorValidaciones.addRegla(new RNSeleccionTipoCereal(2));
		motorValidaciones.addRegla(new RNPosiblesCereales(3));
		motorValidaciones.addRegla(new RNCerealMayorRendimiento(4));
		
		Cereal cerealASembrar = null;
		Siembra siembra = null;
		Sembradora sembradora = new Sembradora();
		
		List<Lote> lotesASembrar = getLoteMapper().buscarNoSembrados();
		
		if(lotesASembrar != null){
						
			for (Lote lote : lotesASembrar) {
				
				cerealASembrar = sembradora.obtenerCerealASembrar(lote, motorValidaciones);
				
				if (cerealASembrar != null) {
					siembra = sembradora.getSiembra(cerealASembrar, fechaDesde,
							fechaHasta);
					siembra.sembrarLote(lote);
					getLoteMapper().modificar(lote);
				} 
			}				
			
		}else{
			throw new NoHayLotesParaSembrarException();
		}

		getSiembraMapper().guardarTodos(sembradora.getTodasSiembras());
		
		return sembradora;
	}
}
